From 78e2e202db32ff0a47772c30a3430f01d4312844 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 27 Jun 2007 20:08:21 +0100 Subject: [PATCH] Fix VMX guest can't boot after MCE enabled. Signed-off-by: Xin Li --- xen/arch/x86/hvm/vmx/vmx.c | 9 +++++---- xen/include/asm-x86/processor.h | 6 ++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index dccf27515f..2c5d4eb35b 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2387,14 +2387,15 @@ static int mov_to_cr(int gp, int cr, struct cpu_user_regs *regs) case 4: /* CR4 */ old_cr = v->arch.hvm_vmx.cpu_shadow_cr4; - if ( value & ~mmu_cr4_features ) + if ( value & X86_CR4_RESERVED_BITS ) { - HVM_DBG_LOG(DBG_LEVEL_1, "Guest attempts to enable unsupported " - "CR4 features %lx (host %lx)", - value, mmu_cr4_features); + HVM_DBG_LOG(DBG_LEVEL_1, + "Guest attempts to set reserved bit in CR4: %lx", + value); vmx_inject_hw_exception(v, TRAP_gp_fault, 0); break; } + if ( (value & X86_CR4_PAE) && !(old_cr & X86_CR4_PAE) ) { if ( vmx_pgbit_test(v) ) diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h index 6a44e505d0..2d79337f8a 100644 --- a/xen/include/asm-x86/processor.h +++ b/xen/include/asm-x86/processor.h @@ -81,6 +81,12 @@ #define X86_CR4_OSXMMEXCPT 0x0400 /* enable unmasked SSE exceptions */ #define X86_CR4_VMXE 0x2000 /* enable VMX */ +#define X86_CR4_RESERVED_BITS \ + ~(X86_CR4_VME | X86_CR4_PVI | X86_CR4_TSD | \ + X86_CR4_DE | X86_CR4_PSE | X86_CR4_PAE | \ + X86_CR4_MCE | X86_CR4_PGE | X86_CR4_PCE | \ + X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT | X86_CR4_VMXE) + /* * Trap/fault mnemonics. */ -- 2.30.2